//
//  main.m
//  03-集合
//
//  Created by 曹曹 on 16/7/6.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
#pragma mark - 不可变数组
    // 1> 数组: 可变数组 NSMutableArray 与 不可变数组 NSArray
    // 数组主要是有序的存放元素的集合类型, 并且可以通过下标取值
    // 注意: 数组中只能存放对象类型
    // 不可变数组只能取值
    // 可变数组可以增删改查
    // 2> 初始化数组
    // <1> 初始化方法: initWithObjects: 后面填入的参数一定是对象类型
    //     可变参数 链表(后续讲)
    //     顺序填入需要的元素
    //     初始化结束, 以nil为判别标准
    NSArray *array = [[NSArray alloc] initWithObjects:@"123", nil, @"234", @"345", nil];
    NSLog(@"array = %@", array);
    // <2> 构造器方法:
    NSArray *arr = [NSArray arrayWithObjects:@"123", nil, @"234" @"345", nil];
    NSLog(@"arr = %@", arr);
    // <3> 字面量 同 NSString @"", NSNumber @()
    //     三种初始化方式, 推荐使用字面量
    //     字面量可以识别对象是否为空值, 但一般的初始化方法不可以.
    //     如果为空, 字面量会崩溃, 并且会告诉你 attempt to insert nil object from objects[1]
    //     但是, 初始化方法会识别空值为结束标志, 并不会产生问题, 最终会造成数据丢失
//    NSObject *objec = nil;
//    NSArray *myArray = @[@"123", objec, @"234", @"345"];
//    NSLog(@"muArray = %@", myArray);/**< attempt to insert nil object from objects[1] */
    
    // 3> 取值相关
    //    <1> count 取得数组中元素个数
    NSLog(@"%ld", arr.count);
    //    <2> 数组中取值， 通过下标取值
    NSString *numberString = [arr objectAtIndex:0];
    //    <3> 语法糖取值方式 快捷取值
    NSString *numberStr = arr[0];
    //    <4> 根据值取出对应的下标
    NSUInteger indexOfString = [arr indexOfObject:@"123"];
    //    <5> 判断对象是否存在于数组中
    BOOL hasObject = [arr containsObject:@"123"];
    NSLog(@"%@", hasObject ? @"YES" : @"NO");
    //    <6> 取数组中第0位的元素 / 取数组中最后一位元素(如果数组为空, 返回的对象为空, 并且不会崩溃)
    [arr firstObject];
    [arr lastObject];
    // 4> 不可变数组, 改变元素(会生成新的数组, 不会在原数组基础上修改)
    //    <1> 数组添加一个新的元素
    arr = [arr arrayByAddingObject:@"234"];
    NSLog(@"arr now is %@", arr);
    //    <2> 数组添加另一个数组中的所有元素
    arr = [arr arrayByAddingObjectsFromArray:array];
    NSLog(@"arr changed to %@", arr);
#pragma mark - 可变数组
    // 1> 初始化方法同不可变数组
    // 遇到可变数组, 只能使用初始化方法或者遍历构造器
    // 字面量创建方法不推荐使用
    NSMutableArray *mArray = [NSMutableArray array];
    // 2> 取值方式与不可变数组一样
    // 3> 可变数组改变元素
    //    <1> 添加元素
    [mArray addObject:@"123"];
    //    <2> 插入元素
    [mArray insertObject:@"含蓄" atIndex:0];
    //    <3> 移除第0个元素
//    [mArray removeObjectAtIndex:0];
//    //    移除最后一个元素
//    [mArray removeLastObject];
//    //    移除所有元素
//    [mArray removeAllObjects];
    //    <4> 替换(使用替换时, 数组对应位置不能为空)
    [mArray replaceObjectAtIndex:0 withObject:@"蓄"];
    NSLog(@"%@", mArray);
#pragma mark - 可变 与 不可变的区别
    // 1.可变是可以修改的, 但不可变不可以
    // 2.不可变调用改变的方法时会生成新的对象; 可变调用改变方法时在对象本身上进行修改
    // 3.可变继承于不可变

    // 将字符串根据某个子串, 截取成数组
    // 根据哪个子串截取, 哪个子串就会消失
    NSString *urlString = @"www.baidu.com";
    NSArray *urlArray = [urlString componentsSeparatedByString:@"a"];
    NSLog(@"urlarray:%@", urlArray);
    // 根据某个字符串拼接数组成一个字符串
    NSArray *nameArray = @[@"含蓄", @"隔壁", @"马勒"];
    NSString *nameString = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"nameString:%@", nameString);
    return 0;
}
